package com.liyuhan.onlinetaxibackground.Service.impl;

import com.huawei.shade.com.cloud.sdk.ClientException;
import com.liyuhan.onlinetaxibackground.POJO.CompletedOrder;
import com.liyuhan.onlinetaxibackground.Repository.CompletedOrderRepository;
import com.liyuhan.onlinetaxibackground.Repository.UserRepository;
import com.liyuhan.onlinetaxibackground.Service.SMSService;
import com.liyuhan.onlinetaxibackground.Util.GetRequestBody;
import com.liyuhan.onlinetaxibackground.Util.JedisPoolUtils;
import com.liyuhan.onlinetaxibackground.Util.TengXunSMSUtils;
import com.liyuhan.onlinetaxibackground.dto.DataResponse;
import com.sun.org.apache.xpath.internal.operations.Bool;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Service
public class SMSImpl implements SMSService {
    @Autowired
    private UserRepository userRepository;
    @Autowired
    private CompletedOrderRepository completedOrderRepository;

    // 注册短信模板ID：1484313
    private static final String REGISTERTEMPLATECODE = "1484313";
    // 登录短信模板ID：1484004
    private static final String LOGINTEMPLATECODE = "1484004";
    // 提醒付费模板ID：1484004
    private static final String PAYTEMPLATECODE = "1532023";

    // 响应体
    private DataResponse dataResponse = new DataResponse();
    private Map<String, String> map = new HashMap<>();

    public DataResponse registerMessage(String request) {
        // 获取手机号
        String phone = GetRequestBody.getRequestBody(request).getString("phone");

        // 首先查找该手机号是否已经注册
        if (userRepository.findUserByPhone(phone).isPresent()) {
            Map<String, String> map = new HashMap<>();
            map.put("error", "该手机号已注册！短信发送失败");
            dataResponse = new DataResponse("400", map);
            // 返回错误信息
            return dataResponse;
        }

        // 生成验证码
        String verifyCode = generateVerifyCode().toString();
        // 发送验证码
        try {
            TengXunSMSUtils.sendShortMessage(REGISTERTEMPLATECODE, phone, verifyCode, "5");
        } catch (ClientException e) {
            map.put("error", "短信发送失败！");

            dataResponse.setCode("400");
            dataResponse.setData(map);

            return dataResponse;
        }

        // 未发生错误
        map.put("success", "短信发送成功！");
        map.put("validate-code", verifyCode);
        dataResponse.setCode("200");
        dataResponse.setData(map);

        // 将验证码放入redis，并设置五分钟过期
        saveVerifyCode(phone, verifyCode);

        return dataResponse;
    }

    @Override
    public DataResponse loginMessage(String request) {
        // 获取手机号
        String phone = GetRequestBody.getRequestBody(request).getString("phone");

        // 首先查找该手机号是否已经注册
        if (userRepository.findUserByPhone(phone).isPresent()) {
            // 手机号存在
            // 生成验证码
            String verifyCode = generateVerifyCode().toString();
            // 发送验证码
            try {
                TengXunSMSUtils.sendShortMessage(LOGINTEMPLATECODE, phone, verifyCode, "5");
            } catch (ClientException e) {
                map.put("error", "短信发送失败！");

                dataResponse.setCode("400");
                dataResponse.setData(map);

                return dataResponse;
            }

            // 未发生错误
            map.put("success", "短信发送成功！");
            map.put("validate-code", verifyCode);
            dataResponse.setCode("200");
            dataResponse.setData(map);

            // 将验证码放入redis，并设置五分钟过期
            saveVerifyCode(phone, verifyCode);

            return dataResponse;
        } else {
            // 手机号未注册
            map.put("error", "手机号未注册！无法使用验证码登录");

            dataResponse = new DataResponse("400", map);
            return dataResponse;
        }
    }

    @Override
    public DataResponse payMessage(String request) {
        // 获取手机号
        String orderId = GetRequestBody.getRequestBody(request).getString("orderId");

        // 通过订单获取乘客手机号
        CompletedOrder completedOrder = completedOrderRepository.findById(Integer.valueOf(orderId)).get();
        String phone = completedOrder.getPassenger().getUser().getPhone();

        // 未发生错误
        // 将发送记录放入redis，并设置十分钟之内不可再次发送
        String result = saveVerifyCode2(phone);
        if (result == null) {
            // 发送提示信息
            try {
                TengXunSMSUtils.sendShortMessage(PAYTEMPLATECODE, phone);
            } catch (ClientException e) {
                map.put("error", "短信发送失败！");
                return new DataResponse("1000", map);
            }

            return new DataResponse("200", null);
        } else {
            map.put("error", result);
            return new DataResponse("1000", map);
        }
    }

    // 每个手机每天只能发送三次，验证码放到redis中，设置过期时间300s
    public static String saveVerifyCode2(String phone) {
        //连接redis
        Jedis jedis = JedisPoolUtils.getJedis();

        //拼接key
        //手机发送次数key
        String countKey = "informPay" + phone + ":count";
        // 用户信息
        String phoneKey = "informPay" + phone + ":phone";

        // 每个司机每天只能提醒对应用户三次
        String count = jedis.get(countKey);
        if (count == null) {
            //没有发送次数，第一次发送
            //设置发送次数是1
            jedis.setex(countKey, 24 * 60 * 60, "1");
        } else if (Integer.parseInt(count) <= 3) {
            //发送次数+1
            jedis.incr(countKey);
        } else if (Integer.parseInt(count) > 3) {
            //发送三次，不能再发送
            jedis.close();
            return "今天发送次数已经超过三次";
        }

        // 每次提醒的时间间隔必须超过十分钟
        if (jedis.exists(phoneKey)) {
            return "每十分钟只能进行一次提醒~";
        }

        // 发送验证码放到redis里面
        // 设置十分钟后可以再次提醒
        jedis.setex(phoneKey, 600, phone);
        jedis.close();

        return null;
    }

    // 每个手机每天只能发送三次，验证码放到redis中，设置过期时间300s
    public static void saveVerifyCode(String phone, String code) {
        //连接redis
        Jedis jedis = JedisPoolUtils.getJedis();

        //拼接key
        //手机发送次数key
        String countKey = "VerifyCode" + phone + ":count";
        //验证码key
        String codeKey = "VerifyCode" + phone + ":code";

        System.out.println("验证码：" + code);

        // 每个手机每天只能发送八次（为了调试方便）
        String count = jedis.get(countKey);
        if (count == null) {
            //没有发送次数，第一次发送
            //设置发送次数是1
            jedis.setex(countKey, 24 * 60 * 60, "1");
        } else if (Integer.parseInt(count) <= 8) {
            //发送次数+1
            jedis.incr(countKey);
        } else if (Integer.parseInt(count) > 8) {
            //发送三次，不能再发送
            System.out.println("今天发送次数已经超过8次");
            jedis.close();
        }

        // 发送验证码放到redis里面
        // 设置5分钟过期
        jedis.setex(codeKey, 300, code);
        jedis.close();
    }

    // 随机生成六位验证码
    public static Integer generateVerifyCode() {
        Integer code = null;

        code = new Random().nextInt(999999);//生成随机数，最大为999999
        if (code < 100000) {
            code = code + 100000;//保证随机数为6位数字
        }

        return code;
    }
}
